﻿
namespace LM.Negocio.Validadores
{
    using LM.InterfacesFabricas.Interfaces.Repositorios;
    using System;
    using System.Linq;

    public class ValidadorDeGaragem : ValidadorAbastrato
    {
        private Garagem _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Garagem> _repositorioDeGaragem;

        public ValidadorDeGaragem(IRepositorioDeConsultaDeObjetos<Garagem> repositorioDeGaragem)
        {
            if (repositorioDeGaragem == null)
            {
                throw new ArgumentNullException("repositorioDeGaragem");
            }

            _repositorioDeGaragem = repositorioDeGaragem;
        }

        public void ValideCadastro(Garagem garagem)
        {
            if (garagem == null)
            {
                throw new ArgumentException("garagem");
            }

            _objetoValidado = garagem;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideCNPJNaoInformado();
            ValideInscricaoMunicipalNaoInformada();
            ValideGaragemJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao(Garagem garagem)
        {
            if (garagem == null)
            {
                throw new ArgumentException("garagem");
            }

            _objetoValidado = garagem;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideCNPJNaoInformado();
            ValideInscricaoMunicipalNaoInformada();
            ValideGaragemJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideExclusao(Garagem garagem)
        {
            if (garagem == null)
            {
                throw new ArgumentException("garagem");
            }

            _objetoValidado = garagem;
            base.LimpeInconsistencias();

            ValideGaragemNaoCadastrada();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if (_objetoValidado.Codigo == 0)
            {
                AdicioneInconsistencia("Código não informado.");
            }
        }

        private void ValideNomeNaoInformado()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Nome))
            {
                AdicioneInconsistencia("Nome não informado.");
            }
        }

        private void ValideCNPJNaoInformado()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.CNPJ))
            {
                AdicioneInconsistencia("CNPJ não informado.");
            }
        }

        private void ValideInscricaoMunicipalNaoInformada()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.InscricaoMunicipal))
            {
                AdicioneInconsistencia("Inscrição municipal não informada.");
            }
        }

        private bool GaragemJaCadastrada()
        {
            return _repositorioDeGaragem.Consulte(m => m.Codigo == _objetoValidado.Codigo).Any();
        }

        private void ValideGaragemJaCadastrada()
        {
            if (GaragemJaCadastrada())
            {
                AdicioneInconsistencia("Já existe uma Garagem cadastrada com o código {0}.", _objetoValidado.Codigo);
            }
        }

        private void ValideGaragemNaoCadastrada()
        {
            if (!GaragemJaCadastrada())
            {
                AdicioneInconsistencia("Garagem com o código {0} não cadastrado.", _objetoValidado.Codigo);
            }
        }
    }
}
